MATLAB颜色图中,小于某个值的所有点设为白色

您所在的位置:网站首页 matlab image改颜色 MATLAB颜色图中,小于某个值的所有点设为白色

MATLAB颜色图中,小于某个值的所有点设为白色

2023-12-05 11:59| 来源: 网络整理| 查看: 265

文章目录 1.问题提出2.MATLAB工程图形处理方式3.什么是colormap4.什么是CData5.Scaled方式6.pcolor函数不能胜任7.patch登场

1.问题提出

如图1所示MATLAB输出的二维颜色图,这个图使用pcolor(x,y,Er)指令产生,x,y是对应的坐标,x=0:0.5:50;y=0:05:50;Er(101*101矩阵)表示(x,y)点计算出来的误差值。现在如果想把Er中小于0.05的所有点设置显示为白色,该如何做? 图1

图1 原始图 2.MATLAB工程图形处理方式

在解决这个问题之前,先来说一下MATLAB对彩色图形的处理方式。MATLAB中的图形常见的有以下几类:

Truecolor:数码相机的格式,广泛用于计算机图形。Indexed 和 scaled indexed;经常用来显示科学或者工程数据,使用的不同的颜色深浅可以代表不同的数据大小。Grayscale:经常用在图像处理和图像分析算法中;Binary:经常用做为一个封装来表示图形的分割结果或者是感兴趣的区域。

那么图1这种图形就属于第2种,使用颜色比例代表不同的数据大小。在上述图形中,Er中不同的值,是如何对应到不同的颜色的呢?使用pcolor画图时,需要介绍两个关键的数据,一个是colormap,一个是Cdata。

3.什么是colormap

先来看colormap。当用figure产生一个图窗时,里面就包含了一个预先设置的颜色数据矩阵,这个颜色数据矩阵的尺寸一般是64*3,每一行为介于0.0到1.0之间的值组成的RGB颜色数据。可以用MAPX=colormap,获取当前figure的颜色数据矩阵,如图2所示。实际上MATLAB预先提供了一些预定义的颜色数据矩阵,这些颜色数据矩阵的名称和对应的色阶如图3所示。

图2

图2,颜色数据矩阵

图3

图3 MATLAB预定义的颜色矩阵名称与色阶

通常,MATLAB默认使用的颜色矩阵就是jet,大家看图1中的颜色条和jet色阶是不是一样的?都是从深蓝开始到深红结束。这些预定义的颜色矩阵都是64行(即64种颜色)。可以使用jet(n)指令,重新设置jet的行数,如jet(256),这样就把jet颜色扩充到256种颜色。需要注意的是,虽然扩展到了256种颜色,但是还是从深蓝开始到深红结束。只不过原来这两种颜色中间划分了64种颜色,而现在划分了256种颜色,划分的颜色更细腻而已。

我们可以把新的颜色矩阵应用到figure中,例如:

MAP=jet(256); colormap(MAP);

这样,figure中使用的颜色矩阵就是被扩充到256色的jet颜色,而不是原来64色的jet颜色。

4.什么是CData

下面再来看CData数据。我们知道,图1中的颜色代表了Er的数值大小,即Er数值越大,颜色越红,Er数值越小,颜色越蓝。那么这种数据大小是如何对应到不同的颜色中的呢?实际上MATLAB是使用Er的值作为索引值,在colormap颜色矩阵中进行查表,从而知道该点对应的颜色。在MATLAB中,这种索引机制有两种,一种是直接索引direct,另一种是scaled,即按比例索引。到底用哪种索引方式,由当前图形句柄的’CDatamapping’属性决定。

h=pcolor(x,y,Er); get(h,’ CDatamapping’);

输出为scaled,这表明当前使用的索引方式是按比例索引。

那么CData数据是什么呢?实际上当我们用h=pcolor(x,y,Er)画图时,真正使用的索引数据并不是Er,而是CData数据。CData是一个矩阵,大小和Er相同,在调用pcolor时,由Er按比例计算得到(即Er中数值大的对应的CData中的值就大,Er中数值小的对应的CData中的值就小)。一般而言,初始得到的CData的值和Er的值是相同的。可以使用Cdatat=get(h,‘CData’),获取当前的CData数据,如图4所示。

图4

图4 CData数据 5.Scaled方式

索引方式使用scaled方式时,CData的最小值对应colormap中颜色矩阵的第1行的颜色,CData的最大值对应colormap中的最后1行颜色,CData的中间值,就按比例关系,计算出对应的colormap中的行数,即该点的颜色。例如,假设colormap中共有64行颜色,CData的最大值为cmax(对应第64行),最小值为cmin(对应第1行),若CData有一个数据,值为cind,该值在colormap对应的行数为ind。那么按照比例原则,可列出如下公式:(cmax-cind)/(cind-cmin)=(64-ind)/(ind-1)。如果令k=(cmax-cind)/(cind-cmin),那么可计算出ind=(64+k)/(k+1),因为是行数,计算出来的值取整数。

这样,根据CData中的数值大小,计算出在colormap中对应的行数,CData的值越小,对应的行号越小,CData的值越大,对应的行号越大。而CData是由Er按比例得到的,因此就实现了Er中不同的值,对应的颜色不同,即图1中的颜色图。

另外,scaled比例的最大值和最小值一般就是CData中的最大值和最小值,但这个值也可以由axes的Clim属性控制。可以用cm=caxis获取当前scaled比例的最大值和最小值。cm(1)是最小值,cm(2)是最大值。可以使用caxis([newmin,newmax])来设置比例的最小值和最大值。此时CData中所有比newmin小的值,都对应colormap的第一行颜色,CData中所有比newmax大的值,都对应colormap的最后一行颜色。

如果索引方式是direct,那么就用CData的真实值进行索引颜色,如Cdata的值是1.2,那对应的颜色就是colormap中的第1行,如CData的值是1000.4(超过了colormap的最大行数),那么就对应colormap中的最后一行。

事实上,在获取CData的数据之后,我们还可以对获取的CData数据进行调整,然后把调整之后的CData数据重新应用到图形中。使用如下指令使用新的CData数据:set(h,‘CData’,Cdatat)。Cdatat是新调整后的CData数据。

做一个梳理: 当使用h=pcolor(x,y,Er)画图时,完成了下列工作: (1)根据Er,按比例计算CData矩阵; (2)CData的最小值对应colormap中的第1行颜色,CData的最大值对应colormap中最后一行颜色,CData的中间值按照比例关系进行计算对应的颜色。 (3)索引出来每个点的颜色之后,使用该颜色对该点着色,得到图1。

那么回过头来,看当初的问题。对于图1所示的图,如何把Er中小于0.05的数值显示为白色呢?一种思路是这样: (A)获取当前图形的colormap颜色数据; (B)在颜色数据的最前面插入一行白色[1,1,1]; (C)获取当前CData值; (D)把所有的Er



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3